package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import negocio.Clase;
import negocio.ClaseControlador;
import negocio.Cursada;
import negocio.Usuario;

import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

import java.awt.Color;
import java.util.ArrayList;

import javax.swing.JButton;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Clases extends JFrame {

	private JPanel contentPane;
	private Cursadas padreCursadas;
	private Cursada cursada;
	private JTable table;
	private ArrayList<Clase> clases= new ArrayList<Clase>();
	ClasesCrear clasesCrear;
	private Clases padreClases=this;
	Asistencias asistencias;
	private Usuario usuario;
	private JLabel lblNewLabel;
	JButton btnCrearClases;
	JButton btnAgregarClase;
	AgregarClase agregarClase=null;
	AsignarSala asignarSala=null;
	DefaultTableModel tm;
	
	public void nullAgregarClase()
	{
		this.agregarClase=null;
	}
	
	public void nullAsignarSala()
	{
		this.asignarSala=null;
	}
	public Clases(Cursada cursada, Cursadas padreCursadas, Usuario usuario) {
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e){
				padreCursadas.nullClasesExaminar();
				tm.setRowCount(0);
			}
		});	
		
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 460, 372);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		this.cursada=cursada;
		this.padreCursadas=padreCursadas;
		this.usuario=usuario;
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "Listado de clases", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setBounds(4, 9, 440, 235);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(6, 43, 424, 181);
		panel.add(scrollPane);
		
		table = new JTable(){
			@Override
			public boolean isCellEditable(int row, int colum)
			{
				return false;
			}
		};
		scrollPane.setViewportView(table);
		
		lblNewLabel = new JLabel("No hay clases creadas. Para crearlas, presionar el boton Creacion inicial de clases");
		lblNewLabel.setForeground(Color.RED);
		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel.setBounds(10, 18, 410, 14);
		panel.add(lblNewLabel);
		
		JButton btnSalir = new JButton("Salir");
		btnSalir.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				padreCursadas.nullClasesExaminar();
				tm.setRowCount(0);
				
				dispose();
			}
		});
		btnSalir.setBounds(345, 300, 89, 23);
		contentPane.add(btnSalir);
		
		btnCrearClases = new JButton("Creacion inicial de clases...");
		btnCrearClases.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(clasesCrear==null)
				{
					clasesCrear=new ClasesCrear(padreClases,cursada);
				}
				clasesCrear.setVisible(true);
			}
		});
		btnCrearClases.setBounds(4, 289, 188, 23);
		contentPane.add(btnCrearClases);
		btnCrearClases.setVisible(false);
		
		JButton btnAsistencias = new JButton("Asistencias");
		btnAsistencias.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(table.getSelectedRow()!=-1)
				{
					clases = ClaseControlador.getClases(cursada);
					if(asistencias==null)
						asistencias=new Asistencias(padreClases, clases.get(table.getSelectedRow()), usuario);
					asistencias.setVisible(true);
				}
				else
				{
					JOptionPane.showMessageDialog(contentPane, "No se ha seleccionado ninguna clase, por favor elija una.", "Error", JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		btnAsistencias.setBounds(4, 255, 89, 23);
		contentPane.add(btnAsistencias);
		
		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(table.getSelectedRow()!=-1)
				{
					if(!(clases.get(table.getSelectedRow()).getEstado().equalsIgnoreCase("Dictada")))
					{
						JOptionPane.showMessageDialog(padreClases, "Clase cancelada");
						ClaseControlador.setEstado(clases.get(table.getSelectedRow()), "Cancelada");
						llenarTabla();
					}
					else
					{
						JOptionPane.showMessageDialog(contentPane, "No se puede cancela una clase ya dictada.", "Error", JOptionPane.ERROR_MESSAGE);
					}
				}
				else
				{
					JOptionPane.showMessageDialog(contentPane, "No se ha seleccionado ninguna clase, por favor elija una.", "Error", JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		btnCancelar.setBounds(103, 255, 89, 23);
		contentPane.add(btnCancelar);
		
		btnAgregarClase = new JButton("Agregar clase");
		btnAgregarClase.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(agregarClase==null)
				{
					agregarClase=new AgregarClase(padreClases,cursada);
				}
				agregarClase.setVisible(true);
			}
		});
		btnAgregarClase.setBounds(202, 255, 103, 23);
		contentPane.add(btnAgregarClase);
		
		JButton button = new JButton("Asignar sala");
		button.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(asignarSala==null&&table.getRowCount()>0)
				{
					asignarSala=new AsignarSala(padreClases, clases.get(table.getSelectedRow()));
				}
				asignarSala.setVisible(true);
			}
		});
		button.setBounds(315, 255, 103, 23);
		contentPane.add(button);
		this.setTitle("Clases de la cursada "+ cursada.getCodigo());
		lblNewLabel.setVisible(false);
		
		this.cursada=cursada;
		this.padreCursadas=padreCursadas;
		this.llenarTabla();
		if(table.getRowCount()!=0)
			table.changeSelection(0, 0, false, false);
		if(usuario.getPerfil().equals("Instructor"))
		{
			btnCancelar.setVisible(false);
			btnAgregarClase.setVisible(false);
			btnCrearClases.setVisible(false);
		}
	}
	
	public void llenarTabla()
	{
		clases = new ArrayList<Clase>();
		tm = new DefaultTableModel();
		Object[] encabezado = {"Fecha", "Hora de inicio", "Hora de finalizacion", "Aula", "Estado"};
		tm.setColumnIdentifiers(encabezado);
		clases = ClaseControlador.getClases(cursada);
		ArrayList<String> fila=new ArrayList<String>();
		for(Clase c : clases)
		{
				fila.add(c.getFecha().toString());
				fila.add(c.getHoraInicio().toString());
				fila.add(c.getHoraFin().toString());
				
			
			if(c.getSala()!=null)
				fila.add(c.getSala().toString());
			else
				fila.add("No asignada");
			fila.add(c.getEstado());
				
			tm.addRow(fila.toArray());
			fila.clear();
		}
		table.setModel(tm);
		if(table.getRowCount()==0)
		{
			lblNewLabel.setVisible(true);
			btnCrearClases.setVisible(true);
			btnAgregarClase.setVisible(false);
		}
		else
		{
			lblNewLabel.setVisible(false);
			btnCrearClases.setVisible(false);
			btnAgregarClase.setVisible(true);
		}
	}

	public void nullClasesCrear() {
		clasesCrear=null;
		
	}

	public void nullAsistencias() {
		this.asistencias=null;
		
	}
}
